/**  
 * @Title: WaimaiService.java
 * @Package com.silverbox.sweeporder.service.waimai
 * @author litao
 * @date 2017年12月28日
 */
package com.silverbox.sweeporder.service.waimai;

import java.util.List;
import java.util.Map;
import java.util.Set;

import com.silverbox.core.result.CoreResponse;
import com.silverbox.core.result.CoreResponse.StatusInfo;
import com.silverbox.shopper.dubboApi.alipay.dto.UndiscountWaimaiDTO;
import com.silverbox.shopper.entity.AlipayApplyAuthToken;
import com.silverbox.shopper.entity.ThirdUserInfo;
import com.silverbox.sweeporder.controller.index.vo.ShopperConfigExtend;
import com.silverbox.sweeporder.controller.waimai.entryvo.*;
import com.silverbox.sweeporder.controller.waimai.outvo.*;
import com.silverbox.waimai.entity.Waimai;
import com.silverbox.waimai.entity.WaimaiSerialnumber;
import com.silverbox.waimai.entity.extend.GoodsCartAndDetail;
import com.silverbox.waimai.entity.extend.WaimaiExtend;

/**
 * ClassName: WaimaiService
 * 
 * @author litao
 * @date 2017年12月28日
 */
public interface WaimaiOrderService {
	/**
	 * 创建订单
	 * 
	 * @param waimai
	 * @param goodsList
	 * @param shopper
	 * @param thirdUserInfo
	 * @param shopperConfig
	 * @return WaimaiExtend
	 * @author litao
	 * @date 2018年1月3日
	 */
	WaimaiExtend saveWaimaiOrder(WaimaiExtend waimai, List<GoodsCartAndDetail> goodsList, CreateWaimaiEntryDto createWaimai,
			ThirdUserInfo thirdUserInfo, Double bagPrice,Double boxPrice,String batchNo);

	/**
	 * 更新订单状态
	 * 
	 * @param waimaiExtend
	 * @return void
	 * @author litao
	 * @date 2018年1月4日
	 */
	void updateWaimaiStauts(Waimai waimai);

	/**
	 * 创建加菜订单
	 * 
	 * @param boxGoodsPrice
	 * @param shopper
	 * @param waimai
	 * @param goodsList
	 * @param thirdUserInfo
	 * @param no
     * @param vouchers
     * @return WaimaiExtend
	 * @author litao
	 * @date 2018年1月4日
	 */
	WaimaiExtend saveWaimaiOrderAddFood(WaimaiExtend waimai, List<GoodsCartAndDetail> goodsList,
                                        CreateWaimaiEntryDto createWaimai, ThirdUserInfo thirdUserInfo, Double bagPrice, Double boxPrice, String no,ShopperConfigExtend shopperConfigExtend);

	/**
	 * 获取订单序号
	 * 
	 * @param id
	 * @param num
	 * @return Integer
	 * @author litao
	 * @date 2018年1月11日
	 */
	Integer getOrderSeq(Integer storeId, int num);

	/**
	 * 获取进行中状态订单页面
	 * 
	 * @param id
	 * @param tableName
	 * @param string
	 * @param
	 * @return Waimai
	 * @author litao
	 * @date 2018年1月11日
	 */
	Waimai getMyOrderStatus(Integer storeId, String tableName, String buyerId,Integer clientOrderMode);

	/**
	 * 查询订单按店铺桌台或顾客Id查询
	 * 
	 * @param id
	 * @param tableName
	 * @param string
	 * @return WaimaiExtend
	 * @author litao
	 * @date 2018年1月2日
	 */
	WaimaiExtend getWaimaiDeatils(Integer storeId, String tableName, String buyerId, Integer clientOrderMode, ShopperConfigExtend shopperConfig);

	/**
	 * 根据订单号查询订单
	 * 
	 * @param orderNum
	 * @param
	 * @return WaimaiExtend
	 * @author litao
	 * @date 2018年1月11日
	 */
	WaimaiExtend getWaimaiDeatilsByOrderNum(String orderNum);

	/**
	 * 获取历史订单信息
	 * 
	 * @param id
	 * @param string
	 * @param isFirst
	 * @param pageCount
	 * @param maxId
	 * @return CoreResponse<List<WaimaiVO>>
	 * @author litao
	 * @date 2018年1月15日
	 */
	CoreResponse<HistoryOrderVO> getHistoryOrderDetail(Integer id, String buyerId, Integer pageCount, String createTime,Integer clientOrderMode);

	/**
	 * 获取订单信息根据订单号查询(不包含订单项及details)
	 * 
	 * @param orderNum
	 * @return Waimai
	 * @author litao
	 * @date 2018年1月15日
	 */
	Waimai getWaimaiOrderByOrderNum(String orderNum);

	/**
	 * 获取优惠券
	 * 
	 * @param thirdUserInfo
	 * @param shopper
	 * @param goodIds
	 * @param string
	 * @return List<Integer>
	 * @author litao
	 * @date 2018年1月16日
	 */
	List<Integer> getGoodsCoupon(ThirdUserInfo thirdUserInfo, /*ShopperVO shopper*/Integer storeId, Set<Integer> goodIds, String shopId);

	/**
	 * 更新订单
	 * 
	 * @param waimai
	 * @return
	 */
	int updateWaimai(Waimai waimai);

	/**
	 * 根据订单编号查询支付宝待撤销订单记录
	 * 
	 * @param orderNum
	 * @return
	 */
	List<WaimaiSerialnumber> getWaimaiSerialnumberByOrderNum(String orderNum);

	/**
	 * 保存等待支付宝撤销订单记录
	 * 
	 * @param record
	 * @return
	 */
	int saveWaimaiSerialnumber(WaimaiSerialnumber record);

	/**
	 * 根据第三方交易号删除撤单记录
	 * 
	 * @param outTradeNo
	 * @return
	 */
	int deleteWaimaiSerialNumberByOutTradeNo(String outTradeNo);

	/**
	 * 拼接订单中计算不打折金额所需信息
	 * 
	 * @param waimai
	 * @return
	 */
	public UndiscountWaimaiDTO getUndiscountWaimaiDTO(WaimaiExtend waimai);

	/**
	 * 获取扫码下单优惠前置信息
	 * 
	 * @param orderNum
	 * @param apdid_token
	 * @param buyerId
	 * @param storeId
	 * @param alipayUserId
	 * @return
	 */
	public CoreResponse<KoubeiDiscountInfoVO> getKoubeiDiscountInfo(KoubeiDiscountEntryVO koubeiDiscount);

	/**
	 * 根据订单号获取订单状态(包含订单项及details)
	 * @param orderNum
	 * @return CoreResponse<WaimaiVO>
	 * @author litao
	 * @date 2018年1月23日
	 */
	CoreResponse<WaimaiVO> getWaimaiByOrderNum(OrderQueryDto orderQueryVo);

	/**
	 * 获取未完成订单
	 * @param  storeId 店铺Id
	 * @param  tableName 桌台名称
	 * @return Waimai  
	 * @author litao
	 * @date 2018年2月25日
	 */
	Waimai hasUnfinishedOrder(Integer storeId, String tableName,Integer md);


	/**
	 * 历史订单删除订单记录
	 * @param orderIds
	 * @author CH
	 * @date 2018.5.3
	 */
	CoreResponse<StatusInfo> deleteHistoryOrderByOrderId(String[] orderIds);
	
	/**
	 * 获取进行中订单信息
	 * @param tableInfoId
	 * @param orderNum
	 * @param storeId
	 * @param buyerId
	 * @param memberId
     * @author CH
	 * @date 2018.5.4
	 */
	CoreResponse<WaimaiVO> getMyOrder(OrderQueryDto orderQueryVo);
	
	/**
	 *  取消订单
	 * @param orderNum
	 * @date 2018.5.4
	 * @return
	 */
	CoreResponse<StatusInfo> deleteMyOrderAndRes(String orderNum);
	/**
	 * 领取优惠券
	 * @param buyerId
	 * @param shopId
	 * @param storeId
	 * @param orderNum
	 * @author CH
	 * @date 2018.5.4
	 * @return
	 */
	CoreResponse<StatusInfo> getGoodsCouponV2(String buyerId, String shopId, Integer storeId, String orderNum,Integer authMode);
	
	/**
	 * 购物车页面创建订单时判断是否存在已售罄商品及获取订单状态
	 * @param storeId
	 * @param buyerId
	 * @param tableInfoId
	 * @author CH
	 * @date 2018.5.4
	 * @return
	 */
	CoreResponse<GoodsAndOrderStateVO> getGoodsAndOrderState(Integer storeId, String buyerId, String tableName,Integer clientOrderMode);

	/**
	 * 发送代付请求成功后调用
	 * @param orderNum
	 * @author CH
	 * @date 2018.5.4
	 * @return
	 */
	CoreResponse<Map<String,Object>> findOtherPaySucc(String orderNum);
	
	/**
	 * 刷新授权令牌
	 * 
	 * @param token
	 * @return
	 */
	AlipayApplyAuthToken flushAuthToken(AlipayApplyAuthToken token);


	/**
	 * 创建订单
	 * @param createWaimai   
	 * @return void  
	 * @throws
	 * @author litao
	 * @date 2018年5月9日
	 */
	CoreResponse<SaveWaimaiVO> createWaimaiOrder(CreateWaimaiEntryDto createWaimai);

	/**
	 * 查询在线订单核销订单
	 * @param storeId
	 * @param buyerId
	 * @return
	 */
	List<WaimaiExtend> getOnlineOrderHexiao(Integer storeId, String buyerId,Integer clientOrderMode);
	
	/**
	 * 在线订单创建订单
	 * @param createWaimai
	 * @return
	 */
	CoreResponse<SaveWaimaiVO> createOnlineOrder(CreateWaimaiEntryDto createWaimai);

	/**
	 * 在线订单订单核销
	 * @param clientOrderMode 
	 * @param orderNum
	 * @return
	 */
	CoreResponse<List<WaimaiVO>> orderHexiao(Integer storeId,String buyerId, Integer clientOrderMode);
	
	/**
	 * 在线订单进行核销
	 * @param orderHexiaoEntry
	 * @return
	 */
	CoreResponse<UpdateOrderHexiaoVO> updateOrderHexiao(OrderHexiaoEntryVO orderHexiaoEntry);
	
	/**
	 * 获取店铺是否在承接端开启接口，在线订单是否在营业时间范围内
	 * @param storeId
	 * @param buyerId
	 * @param clientOrderMode
	 * @return
	 */
	CoreResponse<SweepCloseVO> getSweepClose(Integer storeId, Integer clientOrderMode);

	/**
	 * 在线订单取餐柜订单顾客请求取餐
	 */
	Map<String,Object> updateCupboard(OpenCupboardEntryVO openCupboardVO);

	/**
	 * 根据订单号修改订单信息
	 * @param param
	 * @return
	 */
	int updateWaimaiByOrderNum(Waimai param);

	/**
	 * 获取该店铺取餐柜待取餐的订单数量
	 * @param storeId
	 * @param buyerId
	 * @return
	 */
	Map<String, Object> onlineCupboardNum(Integer storeId, String buyerId);

	/**
	 * 根据取餐号查询智慧餐厅订单
	 * @param storeId
	 * @param orderSeq
	 * @return
	 */
	List<WisdomOrderVO> getWisdomOrderBySeq(Integer storeId, String orderSeq,String buyerId);

	/**
	 * 智慧餐厅扫物料码订单信息
	 * @param storeId
	 * @param buyerId
	 * @return
	 */
	List<WisdomOrderVO> getWisdomOrderInfo(Integer storeId, String buyerId);
	
	/**
	 * 查询订单是否有订单锁
	 * @param storeId
	 * @param orderNum
	 * @return
	 */
	CoreResponse<Map<String,Object>> getOrderLockInfo(Integer storeId, String orderNum);
	
	/**
	 * 获取会员优惠券列表
	 * @param storeId
	 * @param tableName
	 * @param buyerId
	 * @param takeMealCode
	 * @param wisdomFlag
	 * @param clientOrderMode
	 * @return
	 */
	CoreResponse<WaimaiVO> getCouponList(Integer storeId, String tableName, String buyerId, String takeMealCode,
			String wisdomFlag, Integer clientOrderMode);
	
	/**
	 * 获取当天未核销的订单
	 * @param storeId
	 * @param buyerId
	 * @param outerSupportId 
	 * @return
	 */
	CoreResponse<List<WaimaiVO>> getTodayNoHexiaoOrder(Integer storeId, String buyerId, Long outerSupportId);
	
	/**
	 * 获取当天未配送的订单
	 * @param storeId
	 * @param buyerId
	 * @return
	 */
	CoreResponse<List<WaimaiVO>> getTodayNoDeliveryOrder(Integer storeId, String buyerId,Long outerSupportId);


	List<Waimai> getMyUnPayOrder(Integer storeId, String tableName, String buyerId);

	void deleteUnpayHistoryOrderById(Long id);


    CoreResponse<Object> getDistributionFee(DistributionFeeVo distributionFeeVo);

    CoreResponse<Object> getWaimaiBusinessInfo(Integer storeId);

    CoreResponse<SaveWaimaiVO> createWaimaiPickingOrder(CreateWaimaiEntryDto createWaimai);

    CoreResponse<Object> findAllOrdersByShop(String memberUid, String appId, Long shopId, String storeName, Integer outSupportId, Integer pageNo, Integer pageSize, String buyerId);

    CoreResponse<Object> promoteOrder(PromoteOrderDto promoteOrder) throws Exception;

}
